package com.itheima.book.manager.dao;

import com.itheima.book.manager.domain.Book;

import java.util.ArrayList;

public class Book2Dao implements BaseBookDao {

    // 定义一个成员变量，这个成员是ArrayList ，作用是用来存储Book数据的 ， 这个成员变量需不需要被static修饰呢？ 根据需要被static进行修饰
    private static ArrayList<Book> books = new ArrayList<Book>() ;

    // 返回存储数据的这个容器
    public Book[] getAllBooks() {

        /**
         * 我们这个方法在定义的时候返回的是一个数组，而我们此时存储数据的容器是一个集合，那么按照我们的想法，把这个返回值类型由数组更改为集合。
         * 但是如果说我们把这个方法的返回值改成了集合，那么后期BookService在调用Book2Dao的方法的时候，只要是涉及到这个方法的调用，我们都需要
         * 将其返回值更改成集合；我们需要改动的位置比较多，为了简化我们的改造，我们此时返回的就是一个数组
         *
         * 但是我们方法需要的返回值需要的就是一个数组，而我们容器选择的是集合，那么我们就需要将这个集合转换成数组进行返回。
         * 集合如何转换成数组
         *
         * 思路： 获取集合中的每一个元素，将其放到数组中； 现在没有数组，因此我们需要去定义一个数组，数组的长度是多少呢? 就是集合的长度
         *
         */
        // 1. 定义数组
        Book[] booksArray = new Book[books.size()] ;

        // 2. 获取集合中的每一个元素，将其放到数组中
        for(int x = 0 ;  x < books.size() ; x++) {

            // 从集合中获取元素
            Book book = books.get(x);

            // 将其放到数组中
            booksArray[x] = book ;
        }

        return booksArray ;

    }


    // 修改方法的实现
    public void updateBookByBookId(Book book) {

        // 1. 根据bookId从集合中查找到要修改的元素对应的索引
        int index = -1;
        for(int x = 0 ;  x < books.size() ; x++) {
            Book bookInList = books.get(x) ;
            if(bookInList != null) {
                if(bookInList.getBookId().equals(book.getBookId())) {
                    index = x ;
                    break;
                }
            }
        }

        // 2. 执行修改操作
        if(index != -1) {
            books.set(index , book);
        }

    }


    // 删除方法实现
    public void deleteByBookId(String bookId) {

        // 1. 根据bookId从集合中查找到对应的元素的索引
        // 定义一个变量来记录这个索引值
        int index = -1 ;

        // 遍历集合
        for(int x = 0 ; x < books.size() ; x++) {

            // 获取每一个元素
            Book book = books.get(x);
            if(book != null) {

                // 判断当前遍历的这个图书的id是否和要删除的图书的id相同，如果相同，就把当前这个索引值赋值给index这个变量
                if(book.getBookId().equals(bookId)) {
                    index = x ;
                    break;
                }

            }

        }


        // 2. 根据索引进行删除操作
        if(index != -1) {

            // 怎么根据索引值将一个元素从集合中删除掉
            books.remove(index);

        }


    }

    // 添加图书
    public boolean addBook(Book book) {

        // 把传递过来的图书Book对象直接存储到ArrayList集合中
        books.add(book) ;

        // 返回
        return true ;

    }

    /**
     * 现在和数据打交道的类有两个了，一个是BookDao(数组作为存储数据的容器) ， Book2Dao(使用集合作为数据存储的容器)
     * 我们发现这两个类中的方法定义是相同的，但是方法的具体实现是不同的；按照我们之前所学习的知识点，我们就应该将这些相同
     * 的方法定义抽取到一个类中，并且这个方法我们需要将其定义成抽象方法；
     *
     * 我们把相同的方法的定义抽取到了BaseBookDao中，那么这个BaseBookDao就应该是我们BookDao和Book2Dao的父类
     */

}
